import { release } from 'node:os' // 引入操作系统模块，用于获取操作系统信息
import { join } from 'node:path' // 引入路径模块，用于处理文件路径
import { BrowserWindow, app, dialog, ipcMain, shell } from 'electron' // 引入 Electron 模块，包括应用控制、窗口、对话框、进程间通信等
import { autoUpdater } from 'electron-updater' // 引入 electron-updater 模块，用于实现自动更新

process.env.DIST_ELECTRON = join(__dirname, '..') // 设置 Electron 构建产物的根目录
process.env.DIST = join(process.env.DIST_ELECTRON, '../dist') // 设置应用构建产物的根目录
process.env.PUBLIC = process.env.VITE_DEV_SERVER_URL
  ? join(process.env.DIST_ELECTRON, '../public')
  : process.env.DIST // 设置公共资源目录，开发环境使用 public 目录，生产环境使用 dist 目录

// Disable GPU Acceleration for Windows 7
if (release().startsWith('6.1')) app.disableHardwareAcceleration() // 在 Windows 7 下禁用 GPU 加速

// Set application name for Windows 10+ notifications
if (process.platform === 'win32') app.setAppUserModelId(app.getName()) // 在 Windows 10+ 系统中设置应用名称，用于通知显示

if (!app.requestSingleInstanceLock()) {
  app.quit()
  process.exit(0)
} // 确保应用只有一个实例在运行，如果已经有实例运行，则退出当前实例

// Remove electron security warnings
// This warning only shows in development mode
// Read more on https://www.electronjs.org/docs/latest/tutorial/security
// process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true' // 移除 Electron 的安全警告（仅在开发模式下）

autoUpdater.autoDownload = false // 禁止自动下载更新，改为手动控制
autoUpdater.autoInstallOnAppQuit = true // 应用退出时自动安装更新

let win: BrowserWindow | null = null // 主窗口实例
// Here, you can also use other preload
const preload = join(__dirname, '../preload/index.js') // 预加载脚本路径
const url = process.env.VITE_DEV_SERVER_URL // 开发服务器 URL
const indexHtml = join(process.env.DIST, 'index.html') // 生产环境 index.html 文件路径

async function createWindow() {
  win = new BrowserWindow({
    title: 'Main window',
    icon: join(process.env.PUBLIC, 'xiaoElogo.ico'), // 应用图标
    webPreferences: {
      preload,
      // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production
      // Consider using contextBridge.exposeInMainWorld
      // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation
      nodeIntegration: true, // 允许在渲染进程中使用 Node.js API
      contextIsolation: false, // 禁用上下文隔离
      webSecurity: false, // 禁用 web 安全策略

    },
  })

  if (process.env.VITE_DEV_SERVER_URL) {
    win.loadURL(url) // 加载开发服务器 URL
    // Open devTool if the app is not packaged
    win.webContents.openDevTools() // 打开开发者工具
  }
  else {
    win.loadFile(indexHtml) // 加载本地 index.html 文件
  }

  // Test actively push message to the Electron-Renderer
  win.webContents.on('did-finish-load', () => {
    win?.webContents.send('main-process-message', new Date().toLocaleString()) // 在页面加载完成后，向渲染进程发送消息
  })

  // Make all links open with the browser, not with the application
  win.webContents.setWindowOpenHandler(({ url }) => {
    if (url.startsWith('https:')) shell.openExternal(url) // 使用默认浏览器打开外部链接
    return { action: 'deny' } // 阻止应用内打开链接
  })
}
let settingsWindow: BrowserWindow | null = null // 设置窗口实例

ipcMain.on('open-settings-window', (event) => {
  if (settingsWindow === null) {
    settingsWindow = new BrowserWindow({
      title: 'Setting',
      width: 700,
      height: 800,
      x: 600,
      y: 200,
      frame: true,
      titleBarStyle: 'default',
      // modal: true, // 模态窗口，会阻塞父窗口 (macOS 不支持)
      parent: win!,
      resizable: false,
      fullscreenable: false,
      webPreferences: {
        nodeIntegration: true,
        contextIsolation: false,
      },
    })
    settingsWindow.on('closed', () => {
      settingsWindow = null
    })
    // const w = BrowserWindow.getFocusedWindow()
    // w!.setWindowButtonVisibility(true)
    if (process.env.VITE_DEV_SERVER_URL) {
      settingsWindow.webContents.openDevTools()
      settingsWindow.loadURL(`${url}#/setting`) // 加载开发环境设置页面
    }

    else { settingsWindow.loadFile(indexHtml, { hash: '/setting' }) } // 加载生产环境设置页面
  }
  else {
    settingsWindow.show() // 如果设置窗口已经存在，则显示它
  }
})

app.on('window-all-closed', () => {
  win = null
  if (process.platform !== 'darwin') app.quit() // 关闭所有窗口时退出应用（非 macOS）
})

app.on('second-instance', () => {
  if (win) {
    // Focus on the main window if the user tried to open another
    if (win.isMinimized()) win.restore()
    win.focus()
  } // 如果应用尝试启动第二个实例，则聚焦到已存在的窗口
})
app.whenReady().then(() => {
  createWindow() // 在应用准备就绪后创建主窗口
  autoUpdater.checkForUpdates() // 检查更新
})
app.on('activate', () => {
  const allWindows = BrowserWindow.getAllWindows()
  if (allWindows.length)
    allWindows[0].focus()
  else
    createWindow() // 在 macOS 上，单击 Dock 图标时，如果没有窗口打开，则创建新窗口
})

// Global exception handler
process.on('uncaughtException', (err) => {
  console.log(err) // 全局异常处理器，打印错误信息
})

/* New Update Available */

autoUpdater.on('error', (err) => {
  dialog.showErrorBox('AutoUpdater Error', err.message) // 自动更新出错时显示错误对话框
})

autoUpdater.on('update-available', (info) => {
  dialog.showMessageBox({
    type: 'info',
    title: `发现新版本：${info.version}`,
    message: '是否立即后台下载更新?',
    buttons: ['是', '否'],
  }).then(({ response }) => {
    if (response === 0)
      autoUpdater.downloadUpdate() // 下载更新
  })
}) // 发现新版本时，询问用户是否下载更新

autoUpdater.on('update-downloaded', () => {
  dialog.showMessageBox({
    type: 'info',
    title: '更新已下载',
    message: '是否立即安装并重新启动应用?',
    buttons: ['是', '否'],
  }).then(({ response }) => {
    if (response === 0)
      autoUpdater.quitAndInstall() // 退出并安装更新
  })
}) // 更新下载完成后，询问用户是否安装更新
